<?php
class App extends Base
{

    /**
     * 应用程序初始化
     * @return void
     */
    public function init()
    {
        // 设定错误和异常处理
        set_error_handler(array(&$this,"appError"));
        set_exception_handler(array(&$this,"appException"));
        
        // Session初始化
        session_start();
        
        // 兼容get_magic_quotes_gpc OFF
		if (get_magic_quotes_gpc()) {
		
		    $_POST = _stripSlashes($_POST);
		    $_GET = _stripSlashes($_GET);
		    $_COOKIE = _stripSlashes($_COOKIE);
		    $_REQUEST = _stripSlashes($_REQUEST);
		}
        
        // 加载惯例配置文件
        C(include(PATH_GI_COMMON .'Convention.php'));
        
        
        // 取得模块和操作名称
        if(!defined('NAME_CONTROLLER')) define('NAME_CONTROLLER',$this->getController()); //控制器名称
        if(!defined('NAME_ACTION')) define('NAME_ACTION',$this->getAction());//Action名称
        
        
        // 加载项目配置文件
        if(is_file(PATH_APP_CONFIG.'Config.php'))
            C(include PATH_APP_CONFIG.'Config.php');
            
        
        //设置时区
    	date_default_timezone_set(C('TIMEZONE'));    
            
        
        return ;
    }

    /**
     * 获得指定的Controller名称
     * @return string
     */
    private function getController()
    {
    	$ret = _gp(C('VAR_CONTROLLER'),'string');
    	empty($ret) && $ret = C('DEFAULT_CONTROLLER');
    	return $ret;
    }

    /**
     * 获得指定的Action名称
     * @return string
     */
    private function getAction()
    {
    	$ret = _gp(C('VAR_ACTION'),'string');
    	empty($ret) && $ret = C('DEFAULT_ACTION');
    	return $ret;
    }

    /**
     * 执行应用程序
     * @return void
     */
    public function exec()
    {
    	
        //创建控制器实例
        $ctrl  =  _getSingleton("Controller_" . NAME_CONTROLLER);
           ;
        //获取当前操作名
        $action = "action" . NAME_ACTION;
        if(strpos($action,':')) {
            // 执行操作链 最多只能有一个输出
            $ctrl	=	explode(':',$action);
            foreach ($actionList as $action){
        		$action = "action" . NAME_ACTION;
            	//todo: 操作链的前置操作
                $ctrl->$action();
            }
        }else{
            if (method_exists($ctrl,'_before_'.$action)) {
                // 执行前置操作
                call_user_func(array(&$ctrl,'_before_'.$action));
            }
            //执行当前操作
            call_user_func(array($ctrl,$action ));
            if (method_exists($ctrl,'_after_'.$action)) {
                //  执行后缀操作
                call_user_func(array(&$ctrl,'_after_'.$action));
            }
        }
        return ;
    }

    /**
     * 运行应用实例 入口文件使用的快捷方法
     * @return void
     */
    public function run() 
    {
        $this->init();
 
        $this->exec();
        return ;
    }

    /**
     * 自定义异常处理
     * @param mixed $e 异常对象
     */
    public function appException($e)
    {
       _halt($e);
    }

    /**
     * 自定义错误处理
     * @access public
     * @param int $errno 错误类型
     * @param string $errstr 错误信息
     * @param string $errfile 错误文件
     * @param int $errline 错误行数
     * @return void
     */
    public function appError($errno, $errstr, $errfile, $errline)
    {
 		switch ($errno) {
          case E_ERROR:
          case E_USER_ERROR:
            $errorStr = "[$errno] $errstr ".basename($errfile)." 第 $errline 行.";
            _halt($errorStr);
            break;
          case E_STRICT:
          case E_USER_WARNING:
          case E_USER_NOTICE:
          default:
            $errorStr = "[$errno] $errstr ".basename($errfile)." 第 $errline 行.";
            //_halt($errorStr);
            break;
      }
    }
};//类定义结束